package ru.averta.notes.service.security.token;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices;
import ru.averta.notes.other.UtilsApi;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * <code>ApiTokenBasedRememberMeServices</code>
 *
 * @author fedor.belov (fedor.belov@mail.ru)
 *         Date: 02.09.11 15:20
 */
public class ApiTokenBasedRememberMeServices extends TokenBasedRememberMeServices {

    Logger logger = LoggerFactory.getLogger(ApiTokenBasedRememberMeServices.class);

    /**
     * Вызывается в случае успешного логина.
     * Возвращает true, если токен необходимо вычислить, сохранить и вернуть клиенту
     * Возвращает false, если это был какой-то другой запрос и token высчитывать и возвращать нет необходимости
     *
     * @param request
     * @param parameter
     * @return
     */
    protected boolean rememberMeRequested(HttpServletRequest request, String parameter) {
        return UtilsApi.isApiTokenLoginRequest(request);
    }

    /**
     * Вызывается в случае успешного логина.
     * Вычисляет токен и сохраняет его в request, чтобы потом вернуть клиенту
     *
     * @param tokens
     * @param maxAge
     * @param request
     * @param response
     */
    protected void setCookie(String[] tokens, int maxAge, HttpServletRequest request, HttpServletResponse response) {
        String cookieValue = encodeCookie(tokens);
        request.setAttribute(SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY, cookieValue);
    }

    /**
     * Получает значение token'а из url'а запроса
     * Требуется, где используется авторизацию по токену
     *
     * @param request
     * @return
     */
    protected String extractRememberMeCookie(HttpServletRequest request) {

        if (UtilsApi.isApiRequestWithToken(request)) {
            String token = UtilsApi.extractTokenFromRequestUrl(request);

            if (token == null) {
                logger.debug("Подключение к API с пустым token'ом");
                token = "wrong_token"; //генерируем левый токен, чтобы пользователь получил ошибку 401
            }

            logger.debug("Подключение к API по токену {}", token);
            return token;
        } else {
            return null;
        }

    }

}
